﻿///////////////////////////////////////////////////////////////
//                                                           //
// Code from Arcanea Project.                                //
//                                                           //
// Please include this license part to every reproduction    //
//   of code.                                                //
//                                                           //
// This code is under Ms-RL license                          //
//                                                           //
// Please read futher information about the license,         //
//   the project (news and updates) and the                  //
//   contributors on the address :                           //
//     http://www.codeplex.com/Arcanea/                      //
//                                                           //
///////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using Arcanea.Mediator;
using Arcanea.Mediator.Exceptions;

namespace Arcanea.BaseEngine.Interfaces
{
    /// <summary>
    /// Classe definissant le contrat que doit respecter une classe ResultSet
    /// </summary>
    public abstract class IBaseResultSet
    {
        /// <summary>
        /// Retourne un bool en fonction d'un index
        /// </summary>
        /// <param name="index">index de la recherche</param>
        /// <returns>la bool trouve</returns>
        public abstract bool GetBool(int index);

        /// <summary>
        /// Retourne un Byte en fonction d'un index
        /// </summary>
        /// <param name="index">index de la recherche</param>
        /// <returns>la Byte trouve</returns>
        public abstract Byte GetByte(int index);

        /// <summary>
        /// Retourne un Int16 en fonction d'un index
        /// </summary>
        /// <param name="index">index de la recherche</param>
        /// <returns>la Int16 trouve</returns>
        public abstract Int16 GetInt16(int index);

        /// <summary>
        /// Retourne un Int32 en fonction d'un index
        /// </summary>
        /// <param name="index">index de la recherche</param>
        /// <returns>la Int32 trouve</returns>
        public abstract Int32 GetInt32(int index);

        /// <summary>
        /// Retourne un Int64 en fonction d'un index
        /// </summary>
        /// <param name="index">index de la recherche</param>
        /// <returns>la Int64 trouve</returns>
        public abstract Int64 GetInt64(int index);

        /// <summary>
        /// Retourne un Single en fonction de l index
        /// </summary>
        /// <param name="index">index de la recherche</param>
        /// <returns>le Single trouve</returns>
        public abstract float GetSingle(int index);

        /// <summary>
        /// Retourne un Decimal en fonction de l index
        /// </summary>
        /// <param name="index">index de la recherche</param>
        /// <returns>le Decimal trouve</returns>
        public abstract Decimal GetDecimal(int index);

        /// <summary>
        /// Retourne un Double en fonction d un index
        /// </summary>
        /// <param name="index">index de la recherche</param>
        /// <returns>la Double trouve</returns>
        public abstract Double GetDouble(int index);

        /// <summary>
        /// Retourne un string en fonction d un index
        /// </summary>
        /// <param name="index">index de la recherche</param>
        /// <returns>la string trouve</returns>
        public abstract string GetString(int index);

        /// <summary>
        /// Retourne une dateTime en fonction d un index
        /// </summary>
        /// <param name="index">index de la recherche</param>
        /// <returns>la dateTime trouve</returns>
        public abstract DateTime GetDateTime(int index);

        /// <summary>
        /// Retourne l objet en fonction de l index.
        /// Il est type grace a l information contenu dans FieldsType 
        /// </summary>
        /// <param name="index">Index de l objet</param>
        /// <param name="type">Type de l objet a retourner</param>
        /// <returns>Objet trouve</returns>
        public object GetObject(int index, string type)
        {
            object result = null;
            if (type == TypeDatabase.AllBaseTypeStrings[0]) //Bool
            {
                result = this.GetBool(index);
            }
            else if (type == TypeDatabase.AllBaseTypeStrings[1]) //Byte
            {
                result = this.GetByte(index);
            }
            else if (type == TypeDatabase.AllBaseTypeStrings[2]) //Int16
            {
                result = this.GetInt16(index);
            }
            else if (type == TypeDatabase.AllBaseTypeStrings[3]) //Int32
            {
                result = this.GetInt32(index);
            }
            else if (type == TypeDatabase.AllBaseTypeStrings[4]) //Int64
            {
                result = this.GetInt64(index);
            }
            else if (type == TypeDatabase.AllBaseTypeStrings[5]) //Single
            {
                result = this.GetSingle(index);
            }
            else if (type == TypeDatabase.AllBaseTypeStrings[6]) //Decimal
            {
                result = this.GetDecimal(index);
            }
            else if (type == TypeDatabase.AllBaseTypeStrings[7]) //Double
            {
                result = this.GetDouble(index);
            }
            else if (type == TypeDatabase.AllBaseTypeStrings[8]) //String
            {
                result = this.GetString(index);
            }
            else
            {
                throw new DatabaseException("Type non reconnu dans de le resultSet");
            }

            return result;
        }

        /// <summary>
        /// Deplace le curseur du resultSet pour pointer vers l objet suivqnt
        /// </summary>
        /// <returns>True si le deplacement s est bien passe, sinon False (fin de liste)</returns>
        public abstract bool NextResult();

        /// <summary>
        /// Ferme le resultSet apres toutes les utilisations.
        /// Doit etre fait avant la fermeture de la connection
        /// </summary>
        public abstract void Close();

    }
}
